《OpenCV》Part1 OpenCV安装配置与Qt5.5测试

您所在的位置:网站首页 qt 添加opencv 《OpenCV》Part1 OpenCV安装配置与Qt5.5测试

《OpenCV》Part1 OpenCV安装配置与Qt5.5测试

2022-06-06 18:53| 来源: 网络整理| 查看: 265

《OpenCV》Part1 OpenCV安装配置与Qt5.5测试

配置环境:

VS2013

Qt5.5.0

OpenCV3.1.0

cmake-3.6.1-win32-x86

1、先去OpenCV官网下载最新的opencv,现在是3.10版本。

2、下载回来的opencv3.1.0其实一个自压缩的文件,将其放在了D盘根目录下了,方便后续的编译和环境变量设置。

3、下载CMAKE,利用CMAKE建立VS的SOLUTION。可以去下载最新的CMAKE,我自己用CMAKE3.6.1,各种版本自己下个就行了,下载后点击cmake-gui.exe右键——以管理员方式运行,设置opencv的sources目录,以及生成的solutions的目录。

1)点第一次configure的时候,会弹出一个现在编译器的对话框,它会自动选择VS2013,其他的默认即可。预计几分钟后会出现下图样子;

2)实际上openCv3.1.0在CMake时是需要连国外的服务器下载相应的dll后才能编译成功的。就出现了下述的长篇大论,网上找的,不过很实用:

CMake过程中一直出现下面错误提示:

Downloading opencv_ffmpeg_64.dll...

CMake Error at cmake/OpenCVUtils.cmake:895 (file):

file DOWNLOAD HASH mismatch

for file: [D:/Program Files (x86)/opencv/sources/3rdparty/ffmpeg/downloads/35fe6ccdda6d7a04e9056b0d73b98e76/opencv_ffmpeg_64.dll]

expected hash: [35fe6ccdda6d7a04e9056b0d73b98e76]

actual hash: [f112aef8bcfad76757e2ebf06c7cf6e5]

status: [28;"Timeout was reached"]

Call Stack (most recent call first):

3rdparty/ffmpeg/ffmpeg.cmake:15 (ocv_download)

cmake/OpenCVFindLibsVideo.cmake:206 (include)

CMakeLists.txt:536 (include)

CMake Error at cmake/OpenCVUtils.cmake:899 (message):

Failed to download opencv_ffmpeg_64.dll. Status=28;"Timeout was reached"

Call Stack (most recent call first):

3rdparty/ffmpeg/ffmpeg.cmake:15 (ocv_download)

cmake/OpenCVFindLibsVideo.cmake:206 (include)

CMakeLists.txt:536 (include)

读一下这几行,可以大致了解如下,在编译过程中,程序下载了一个文件,它的hash值与所期待的不一致,所以导致了错误,接下来到CMakeLists.txt文件(在…...\opencv\sources)中去定位,然而看不懂。。。。。。于是去网上搜索opencv_ffmpeg_64.dll,下载至....../opencv/sources/3rdparty/ffmpeg/downloads/35fe6ccdda6d7a04e9056b0d73b98e76/

还是错误,不过错误提示变了:

Downloading opencv_ffmpeg.dll...

CMake Error at cmake/OpenCVUtils.cmake:895 (file):

file DOWNLOAD HASH mismatch

for file: [D:/Program Files (x86)/opencv/sources/3rdparty/ffmpeg/downloads/89c783eee1c47bfc733f08334ec2e31c/opencv_ffmpeg.dll]

expected hash: [89c783eee1c47bfc733f08334ec2e31c]

actual hash: [3de6314883587d538b4864070e0a749d]

status: [28;"Timeout was reached"]

Call Stack (most recent call first):

3rdparty/ffmpeg/ffmpeg.cmake:10 (ocv_download)

cmake/OpenCVFindLibsVideo.cmake:206 (include)

CMakeLists.txt:536 (include)

CMake Error at cmake/OpenCVUtils.cmake:899 (message):

Failed to download opencv_ffmpeg.dll. Status=28;"Timeout was reached"

Call Stack (most recent call first):

3rdparty/ffmpeg/ffmpeg.cmake:10 (ocv_download)

cmake/OpenCVFindLibsVideo.cmake:206 (include)

CMakeLists.txt:536 (include)

继续下载了一个opencv_ffmpeg.dll,替换至.../opencv/sources/3rdparty/ffmpeg/downloads/89c783eee1c47bfc733f08334ec2e31c/

然后开始Downloading ippicv_windows_20151201.zip,我知道肯定下载不了,继续自己下载

放到/opencv/sources/3rdparty/ippicv/downloads/windows-04e81ce5d0e329c3fbc606ae32cad44d/继续configure。。。。。。如下图,Configuring done

3)再点第二次configure,具体的勾选项可以参考下面两幅图,如果勾选后编译错误,那么勾选的选项自己就得注意点了(这时在勾选后出错的选项可以去勾选,其实configure的次数是几次是没有关系的,只要CMake时不报错,都是没有问题的),等configure完成后,再点generate,结束后会在你的输出目录里生成OpenCV.sln

注意点:

1)CMake时要注意CMAKE_INSTALL_PATH,看默认的路径是哪里,方便后面在VS2013中编译时查找OpenCV.sln文件;

2)VS2013中编译时会有Debug版和Release版,为了区分他们,肯定不能让他们的名字一模一样,所以可以在CMake界面中的Add Entry按键中添加CMAKE_DEBUG_PREFIX,类型为STRING,值为-gd,如果想编译出来的Release版的库也带后缀,同理可以自己设置值,这里略过。

4、以管理员方式用vs打开OpenCV.sln。如下图,先build ALL_BUILD的X86 DEBUG版本,然后再build CMakeTargets下面的install,完成后会生成install\x86\vc14\lib目录,将X86目录直接拷贝到opencv的build目录下。

同理编译Release版,编译完了,Install一下就好了。

5、编译后会生成很多库,但OpenCV自带的X64的为什么就只2个库呢,一个是release的opencv_world310.lib,一个是debug的opencv_world310-gd.lib。

6、将编译后的Lib库合成成一个。

我们要把自己编译的X86的合并成一个文件库,用VS自带的LIB工具。打开VS的命令行,进入到刚才的…\LIB目录下,用下面的命令把那个目录下所有不带D后缀(release版本)的先合成一个opencv-r.lib。对于生成opencv-gd.lib,也是一样的,只是把下面命令里的lib的点前面的r改为gd;中间会提示很多WARNING,全部无视。

第一步:CD D:\OpenCV3.1.0\opencvfile\lib\Debug

第二步:lib /out:opencv-gd.lib opencv_calib3d310-gd.lib opencv_calib3d310-gd.lib opencv_core310-gd.lib opencv_features2d310-gd.lib opencv_flann310-gd.lib opencv_highgui310-gd.lib opencv_imgcodecs310-gd.lib

opencv_imgproc310-gd.lib opencv_ml310-gd.lib opencv_objdetect310-gd.lib opencv_photo310-gd.lib opencv_shape310-gd.lib opencv_stitching310-gd.lib opencv_superres310-gd.lib opencv_ts310-gd.lib opencv_video310-gd.lib opencv_videoio310-gd.libopencv_videostab310-gd.lib opencv_viz310-gd.lib

注:lib文件名提取有个小技巧,这里不再赘述,在我的VTK6.2+VS2013+Qt5.5 测试VTK基于VS2013的Qt程序

一文中有详细介绍。

下面给出Release版的lib库合成命令截图:

7、配置环境变量,此处直接上图,不多介绍,注意的地方就是debug和Release的lib和dll库路径分开:

8、配置VS,做成了一个opencv.props文件。以后要用OPENCV的工程里面加入这个文件即可。

这个可以参照我得链接里给出的文章里介绍的方法。

主要就是添加.h文件、添加.lib文件(已经合成为一个了)、添加.dll文件路径,末尾别忘了把.dll文件拷贝到系统文件夹中,否则有的时候程序是没法运行的,我的win7&64位系统路径是C:\Windows\SysWOW64,此处不再赘述了。

9、

1)VS控制台程序自己测试下就可以了,记得添加opencv.props:

#include #include #include using namespace cv; int main() { // 读入一张图片(原始图片) Mat img=imread("pic.jpg"); // 创建一个名为 "图片"窗口 namedWindow("原始图片"); // 在窗口中显示原始图片 imshow("原始图片",img); // 等待6000 ms后窗口自动关闭 waitKey(6000); }

效果图:

2)Qt5程序名QtTest,类型:application,继承窗口类QMainWindow,添加opencv.props属性表文件:

qttest.h: #ifndef QTTEST_H #define QTTEST_H #include #include "ui_qttest.h" #include #include #include #include class QtTest : public QMainWindow { Q_OBJECT public: QtTest(QWidget *parent = 0); ~QtTest(); public: //void onPushButton_clicked(); private: Ui::QtTestClass ui; cv::Mat image;//图像变量 private slots: void onPushButton_clicked(); void onPushButton_2_clicked(); }; #endif // QTTEST_H

qttest.cpp,有的地方与Qt4是不同的,需要留意下:

#include "qttest.h" QtTest::QtTest(QWidget *parent) : QMainWindow(parent) { ui.setupUi(this); ui.pushButton_2->setEnabled(false);//set process button disable connect(ui.pushButton,SIGNAL(clicked()),this,SLOT(onPushButton_clicked())); connect(ui.pushButton_2, SIGNAL(clicked()),this,SLOT(onPushButton_2_clicked())); } QtTest::~QtTest() { } void QtTest::onPushButton_clicked() { QString fileName = QFileDialog::getOpenFileName(this, tr("Open Image"),".", tr("Image Files(*.png *.jpg *.jpeg *.bmp)"));//QFileDialog image = cv::imread(fileName.toLocal8Bit().data()); //cv::namedWindow("Original Image"); //cv::imshow("Original Image", image); if (image.data) { cv::cvtColor(image, image, CV_BGR2RGB);//CV_BGR2RGB QImage img_orig = QImage((const unsigned char*)(image.data),//Qt image structure image.cols, image.rows, QImage::Format_RGB888); ui.label->setPixmap(QPixmap::fromImage(img_orig)); //cv::namedWindow("Original Image"); //cv::imshow("Original Image",image); ui.pushButton_2->setEnabled(true); } } void QtTest::onPushButton_2_clicked() { cv::flip(image, image, 1);//process the image //cv::cvtColor(image, image, CV_BGR2RGB);//change color channel ordering //*cv::cvtColor(image,image,CV_BGR2RGB);这句如果不注释,输出的图片颜色偏黄,该句在onPushButton_clicked函数中已经变化了*// QImage img = QImage((const unsigned char*)(image.data),//Qt image structure image.cols,image.rows,QImage::Format_RGB888); ui.label->setPixmap(QPixmap::fromImage(img));//display on lable ui.label->resize(ui.label->pixmap()->size());//resize the lable to fit the image //cv::namedWindow("Output Image"); //cv::imshow("Output Image", image); } main.cpp,这个代码没有做任何更改: #include "qttest.h" #include int main(int argc, char *argv[]) { QApplication a(argc, argv); QtTest w; w.show(); return a.exec(); }

运行结果:



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3